package com.gopay.bis.service.bank.impl.ebank;

import java.util.HashMap;
import java.util.Map;

import javax.annotation.Resource;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;

import com.gopay.bis.common.util.BankLogUtils;
import com.gopay.bis.common.util.BisPayCheckUtils;
import com.gopay.bis.common.util.constants.BisPayConstants;
import com.gopay.bis.manager.bank.ebank.CcbB2cManager;
import com.gopay.common.Result;
import com.gopay.common.constants.bank.CcbConstants;
import com.gopay.common.constants.proccode.ProcCodeConstants;
import com.gopay.common.domain.bank.BaseMessage;
import com.gopay.common.domain.bank.ccb.ebank.pay.CcbB2cMessage;
import com.gopay.common.exception.GopayException;
import com.gopay.remote.bank.BankInteractRemoteService;

/**
 * 建行网银B2C业务实现
 * 
 * @CcbB2cBankServiceImpl.java
 * @author WangHongFei
 */
public class CcbB2cBankServiceImpl implements BankInteractRemoteService {
	
    @Resource(name = "ccbB2cManager")
    private CcbB2cManager ccbB2cManager;

    /**
     * 银行支付类请求
     * 
     * @param BaseMessage
     * @return Result
     */
    @Override
    public Result pay(BaseMessage base) {
        Result result = new Result(false);
    	try{
            CcbB2cMessage messageB2C = new CcbB2cMessage();
            BeanUtils.copyProperties(base, messageB2C);
            messageB2C = ccbB2cManager.sign(messageB2C);
            result.setDefaultModel(messageB2C);
            result.setSuccess(true);
    	}catch(GopayException e){
    		BankLogUtils.printServiceImplExceptionLog(e);
            result.setResultCode(e.getErrCode());
        } catch (Exception e) {
            BankLogUtils.printServiceImplExceptionLog(e);
            result.setResultCode(ProcCodeConstants.PROC_CODE_100E6029);
        }
        return result;
    }

    /**
     * 银行返回类请求
     * 
     * @param BaseMessage
     * @return Result
     */
    @Override
    public Result bankBack(BaseMessage base) {
        Result result = new Result(false);
    	try{
            boolean flag = false;
            CcbB2cMessage messageB2C = new CcbB2cMessage();
            BeanUtils.copyProperties(base, messageB2C);
            flag = (Boolean)ccbB2cManager.verify(messageB2C);
            result.setDefaultModel(flag);
            result.setModel("res", messageB2C);
            result.setSuccess(true);

        	Map<String, String> param = new HashMap<String, String>();
        	// 通知后台地址入账
        	if(messageB2C.getSuccess().equals("Y")){	                	               
                param.put("orderId", messageB2C.getOrderId());
                param.put("amt", messageB2C.getAmount().toString());
                param.put("cardType", "Unknown");
                param.put("notifyNum", "1");
                param.put("payStatus", "00");
                param.put("retCode", "00");
                param.put("retMsg", "验签成功");
                param.put("signData", messageB2C.getSignMessage());
                param.put("isFront", String.valueOf(base.isFront()));
                result.setModel("isNotifyCashier", param);
                result.setOrderStatus(true);
            }else{
                // 通知后台地址该订单失败
                param.put("orderId", messageB2C.getOrderId());
                param.put("amt", messageB2C.getAmount().toString());
                param.put("cardType", "Unknown");
                param.put("notifyNum", "1");
                param.put("payStatus", "01");
                param.put("retCode", "01");
                param.put("retMsg", "验签失败");
                param.put("signData", messageB2C.getSignMessage());
                param.put("isFront", String.valueOf(base.isFront()));
                result.setModel("isNotifyCashier", param);
                result.setOrderStatus(false);
        	}
        
    	}catch(GopayException e){
    		BankLogUtils.printServiceImplExceptionLog(e);
    		result.setResultCode(e.getErrCode()); 		
    	} catch (Exception ex) {
			BankLogUtils.printServiceImplExceptionLog(ex);
			result.setResultCode(ProcCodeConstants.PROC_CODE_100E6064);
		}
        return result;
    }

    /**
     * 银行查询类请求
     * 
     * @param BaseMessage
     * @return Result
     */
    @Override
	public Result query(BaseMessage base) {
		Result result = new Result(false);
		try {
            CcbB2cMessage messageB2C = new CcbB2cMessage();
            BeanUtils.copyProperties(base, messageB2C);
			CcbB2cMessage res = ccbB2cManager.query(messageB2C);
			result.setDefaultModel(res);
			result.setSuccess(true);
			if(BisPayCheckUtils.checkExternalOrderID(messageB2C.getOrderId())){
				Map<String, String> param = new HashMap<String, String>();
				param.put("orderId", messageB2C.getOrderId());
				param.put("amount", messageB2C.getAmount().toString());
				if (res == null) {
					// 查询订单为空
					param.put("returnCode", BisPayConstants.QUERYSTATE_FAIL);
					param.put("returnMessage", "银行返回对账结果为空");
					param.put("tradeState", BisPayConstants.TRADESTATE_OTHER);
					result.setModel("queryResult", param);
					return result;
				}
				if (StringUtils.isNotBlank(res.getReturnCode()) && "0".equals(res.getReturnCode())) {
					// 查询订单错误
					param.put("returnCode", BisPayConstants.QUERYSTATE_FAIL);
					param.put("returnMessage", res.getReturnMsg());
					param.put("tradeState", BisPayConstants.TRADESTATE_OTHER);
					result.setModel("queryResult", param);
					return result;
				}
				// 查询成功才进行下面开发
				if (StringUtils.equals(CcbConstants.CCB_SUCCESS,res.getReturnCode())) {
					param.put("returnCode", BisPayConstants.QUERYSTATE_SUCCESS);
					String orderStatus = res.getStatus();
					//失败处理
					if (StringUtils.equals(CcbConstants.B2C_QUERY_FAIL, orderStatus)) {
						param.put("tradeState", BisPayConstants.TRADESTATE_FAIL);
						param.put("returnMessage", "交易失败");
					}
					//成功处理
					else if (StringUtils.equals(CcbConstants.B2C_QUERY_SUCC,orderStatus)) {
						param.put("tradeState", BisPayConstants.TRADESTATE_SUCCESS);
						param.put("returnMessage", "交易成功");
					}
					//不处理
					else if (StringUtils.equals(CcbConstants.B2C_QUERY_NEEDCONFIRM, orderStatus)) {
						param.put("tradeState", BisPayConstants.TRADESTATE_OTHER);
						param.put("returnMessage", "银行返回交易待确认");
					} else if (StringUtils.equals(CcbConstants.B2C_QUERY_SOME_REFUNDMENT, orderStatus)) {
						param.put("tradeState", BisPayConstants.TRADESTATE_OTHER);
						param.put("returnMessage", "银行返回交易部分退款");
					} else if (StringUtils.equals(CcbConstants.B2C_QUERY_ALL_REFUNDMENT, orderStatus)) {
						param.put("tradeState", BisPayConstants.TRADESTATE_OTHER);
						param.put("returnMessage", "银行返回交易全部退款");
					} else {
						param.put("tradeState", BisPayConstants.TRADESTATE_OTHER);
						param.put("returnMessage", "银行返回交易未明情况");
					}
				} else if (StringUtils.equals(CcbConstants.CCB_ORDER_NOTFOUND,res.getReturnCode())) {
					param.put("returnCode", BisPayConstants.QUERYSTATE_SUCCESS);
					param.put("tradeState", BisPayConstants.TRADESTATE_OTHER);
					param.put("returnMessage", "银行返回交易未查到");
				} else {
					param.put("returnCode", BisPayConstants.QUERYSTATE_SUCCESS);
					param.put("tradeState", BisPayConstants.TRADESTATE_OTHER);
					param.put("returnMessage", "银行返回订单查询失败");
				}
				result.setModel("queryResult", param);
			}
		} catch (GopayException e) {
			BankLogUtils.printServiceImplExceptionLog(e);
			result.setResultCode(e.getErrCode());
		}
		return result;
	}

    /**
     * 银行退款类请求
     * 
     * @param BaseMessage
     * @return Result
     */
	@Override
	public Result refund(BaseMessage base) {
		return null;
	}

    /**
     * 银行日终类请求
     * 
     * @param BaseMessage
     * @return Result
     */
	@Override
	public Result dayend(BaseMessage base) {
		return null;
	}

	@Override
	public Result queryBack(BaseMessage base) {
		// TODO Auto-generated method stub
		return null;
	}

    @Override
    public Result refundBack(BaseMessage base) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Result refundQuery(BaseMessage base) {
        // TODO Auto-generated method stub
        return null;
    }

	@Override
	public Result sendBankRefund(BaseMessage base) {
		// TODO Auto-generated method stub
		return null;
	}

   
}
